/**
 * QueryString基础模块
 * 支持：
 * 1.解析url中的query-string，parse函数
 * 2.格式化query对象
 * 3.数组解析和格式化
 * @author ChenMingbing
 * @since 18/04/12
 */

import { isString, isArray, isObject } from './check-types';

/**
 * 解析query-string
 * 支持多个同名key的解析，解析为数组
 * 解析后的value是经过decode的
 * @param  {String} str       query字符串
 * @param  {String} [sep='&'] 参数组分隔符，默认是&
 * @param  {String} [eq='=']  key-value分隔符，默认是=
 * @return {Object}           返回解析后的query对象
 */
export const parse = (str, sep = '&', eq = '=') => {
  if (!str || !isString(str)) return {};

  str = str.replace(/.*?\?/, '');

  let obj = {};
  let groups = str.split(sep);

  for (let i = 0; i < groups.length; i++) {
    let group = groups[i];
    let keyValue = group.split(eq);
    let key = decodeURIComponent(keyValue[0]);
    let value = decodeURIComponent(keyValue[1]);

    // only key
    if (keyValue.length === 1) {
      obj[key] = false;
      continue;
    }

    // array
    if (obj[key]) {
      if (!isArray(obj[key])) obj[key] = [obj[key]];
      obj[key].push(value);
      continue;
    }

    obj[key] = value;
  }

  return obj;
};

/**
 * 格式化query对象
 * 支持数组的格式化，格式化为同名key
 * 格式化后的query-string是经过encode的
 * @param  {Object} obj       query对象
 * @param  {String} [sep='&'] 参数组分隔符，默认是&
 * @param  {String} [eq='=']  key-value分隔符，默认是=
 * @return {String}           返回格式化后的query-string
 */
export const stringify = (obj, sep = '&', eq = '=') => {
  if (obj == null || !isObject(obj)) return '';

  let qs = [];
  let keys = Object.keys(obj);

  for (let i = 0; i < keys.length; i++) {
    let key = keys[i];
    let value = obj[key];

    // array
    if (isArray(value)) {
      let ks = value.map(val => {
        return [encodeURIComponent(key), encodeURIComponent(val)].join(eq);
      });
      qs.push(...ks);
      continue;
    }
    if (key && value) {
      qs.push([encodeURIComponent(key), encodeURIComponent(value)].join(eq));
    }
  }

  return qs.join(sep);
};
